[함수] 다른 서버, 다른 도메인간 세션 공유 방법 1차 개선 :: PHP팁 게시판[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

PHP팁 게시판
[1]
등록일:2007-11-26 16:19:14 (0%)
작성자:
제목:[함수] 다른 서버, 다른 도메인간 세션 공유 방법 1차 개선
안녕하세요...바로  밑에서  세션  공유에  대한  글을  올렸던  TarauS입니다.
제가  올렸던  글에  대해서  많은  분들이  좋은  의견들을  남겨  주셔서  그  글을  참고하여
보안부분을  조금  더  강화한  소스를  다시  올립니다.

달라진  점이라면  그전에는  세션키만을  전송하였기에  세션키만  알아내면  뚫을  수  있는  취약점이  있었으나  이번에는  세션키를  검증할  수  있는  암호화된  키를  함께  체크합니다.
암호화된  키는  사용자가  고유하게  가지는  값들을  암호화  한  값으로  따로  전송할  필요는  없습니다.(사용자의  환경값이나  아이피값을  가지고  만드는  것이기  때문에  한  사용자가  계속  사용중이라면  변하지  않을테니까요^^)
결론적으로  세션키는  예전처럼  iframe를  이용해서  전송하고  그  대신  DB와의  쿼리  부분에  사용자키도  함께  넣어  체크하도록  한  것입니다.
그리고  또한  레퍼러  및  세션키를  받아서  설정하는  파일명도  함께  체크하도록  하여  조금이라도  보안적으로  강력해지도록  노력하였습니다.
이번  수정된  소스를  보시고  또  여러  의견  남겨  주시기  바랍니다.

아~  그리고...사용자키를  암호화하는  함수는  넣지  않았습니다...  이  부분은  여러분들이  찾아서  넣으시기  바랍니다.^^  

설정에  관련된  것은  밑의  게시물을  열어서  보시기  바랍니다.  참고만  하시고  session.inc  파일의  소스는  지금  올린  것을  사용하세요.
http://www.phpschool.com/bbs2/inc_view.html?id=8923&code=tnt2&start=0&mode=&field=&operator=&period=&category_id=&s_que=

##############  session.inc  파일  ###################################################
<?
header('P3P:  CP="NOI  CURa  ADMa  DEVa  TAIa  OUR  DELa  BUS  IND  PHY  ONL  UNI  COM  NAV  INT  DEM  PRE"');
/*  ------------------------------------------------------------------------  
Table  Scheme  

CREATE  TABLE  sessions  (  
session_key  char(32)  not  null,  
session_expiry  int(11)  unsigned  not  null,  
session_value  text  not  null,  
session_check  varchar(250)  not  null,
PRIMARY  KEY  (session_key)  
);  
*/

####  DB  관련설정
$Cfg_DB_Host  =  "db_host";
$Cfg_DB_User  =  "db_user";
$Cfg_DB_Pass  =  "db_pass";
$Cfg_DB_Name  =  "db_name";

####  쿠키  관련  설정
$Cfg_Cookie_Domain  =  ".aaa.com";

####  보안  관련  설정
##  상대편  서버에서  현재  서버의  link.php  파일을  아이프레임으로  호출하는  파일
$Cfg_Http_Referer  =  "http://www.bbb.com/member/login_process.php";
##  현재  서버에서  상대편  서버로부터  넘어오는  세션키를  받는  파일
$Cfg_Php_Self  =  "/member/link.php";  

####  세션  관련  기본  설정
$SESS_DBH  =  "";  
$SESS_LIFE  =  get_cfg_var("session.gc_maxlifetime");  

####  세션키의  유효성을  체크하기  위한  사용자  키
####  사용자  키는  사용자가  고유하게  가지는  값들을  이용하여  만들어주면  됨
##  서버키를  설정  (이  값은  아무것이나  정하시면  됩니다.)
$SERVER_KEY  =  "~1234567890";
##  사용자의  접속  환경
$USER_AGENT  =  $_SERVER["HTTP_USER_AGENT"];
##  사용자의  접속  아이피
$USER_ADDR  =  $_SERVER["REMOTE_ADDR"];
##  사용자  키  (각각의  정보를  이용한  조합은  여러분들이  직접  정하세요.  여기서  보여드리는  것은  예시입니다.)
$USER_KEY  =  $USER_AGENT."||".$USER_ADDR."||".$SERVER_KEY;

####  암호화  함수(유일한  암호화  함수를  직접  제작함)
function  encrypt($key)  {
##  이부분에  암호화  루틴을  넣으면  됨  ##
}

####  암호화  함수를  통해  인코딩된  사용자  키  값
$ENCODE_KEY  =  encrypt($USER_KEY);

function  sess_open($save_path,  $session_name){  
global  $SESS_DBH,$Cfg_DB_Host,$Cfg_DB_User,$Cfg_DB_Pass,$Cfg_DB_Name;

$SESS_DBH  =  mysql_pconnect($Cfg_DB_Host,$Cfg_DB_User,$Cfg_DB_Pass)  or  die("SQL  서버에  접속할  수  없습니다.");  
mysql_select_db($Cfg_DB_Name,  $SESS_DBH)  or  die("SQL  서버에  접속할  수  없습니다.");  

return  true;  
}  

function  sess_close(){  
return  true;  
}  

function  sess_read($key){
global  $SESS_DBH,  $SESS_LIFE,$ENCODE_KEY;

$qry  =  "SELECT  session_value  FROM  sessions  WHERE  session_key  =  '$key'  AND  session_check='$ENCODE_KEY'  and  session_expiry  >  "  .  time();  
$qid  =  mysql_query($qry,  $SESS_DBH);  

if  (list($value)  =  mysql_fetch_row($qid))  {  
return  $value;  
}  

return  false;  
}  

function  sess_write($key,  $val){
global  $SESS_DBH,  $SESS_LIFE,  $ENCODE_KEY;  

$expiry  =  time()  +  $SESS_LIFE;  
$value  =  addslashes($val);

$qry  =  "INSERT  INTO  sessions  (session_key,session_expiry,session_value,session_check)  VALUES  ('$key',  $expiry,  '$value',  '$ENCODE_KEY')";
$qid  =  mysql_query($qry,  $SESS_DBH);

if  (!  $qid)  {
$qry  =  "UPDATE  sessions  SET  session_expiry  =  $expiry,  session_value  =  '$value'  WHERE  session_key  =  '$key'  AND  session_check='$ENCODE_KEY'  AND  session_expiry  >  "  .  time();
$qid  =  mysql_query($qry,  $SESS_DBH);
}

return  $qid;
}

function  sess_destroy($key){
global  $SESS_DBH,$USER_KEY;

$qry  =  "DELETE  FROM  sessions  WHERE  session_key  =  '$key'  AND  session_check='$ENCODE_KEY'";  
$qid  =  mysql_query($qry,  $SESS_DBH);  

return  $qid;  
}  

function  sess_gc($maxlifetime){
global  $SESS_DBH;

$qry  =  "DELETE  FROM  sessions  WHERE  session_expiry  <  "  .  time();  
$qid  =  mysql_query($qry,  $SESS_DBH);  

return  mysql_affected_rows($SESS_DBH);  
}  

####  세션키를  설정하는  함수
function  set_session_id($SESSID){
global  $HTTP_REFERER,  $PHP_SELF;
##  레퍼러  및  현재  파일명을  함께  체크해서  제대로  된  요청일  때만  세션키를  설정
if($SESSID&&$HTTP_REFERER==$Cfg_Http_Referer&&$PHP_SELF==$Cfg_Php_Self)  @session_id($SESSID);
}

set_session_id($SESSID);
session_set_save_handler("sess_open",  "sess_close",  "sess_read",  "sess_write",  "sess_destroy",  "sess_gc");  
session_set_cookie_params(0,  "/",  $Cfg_Cookie_Domain);  
ini_set('session.cache_limiter'  ,'nocache,  must-revalidate-revalidate');
session_start();  
?>  

  
  
  

    
      query        03-04-25  19:20      
function  sess_close(){  
        return  true;  
}  
에서  mysql_close()  안해주는  이유는  머죠?  
돼는김에  중복로긴  방지도  하면  정말  좋게따  
다른  아이피이면  로긴  자체가  안돼게...    
  
function  sess_close(){  
        return  true;  
}  
에서  mysql_close()  안해주는  이유는  머죠?
돼는김에  중복로긴  방지도  하면  정말  좋게따  
다른  아이피이면  로긴  자체가  안돼게...  
    
      query        03-04-25  19:20      
수고하셨습니다  ^^    
  
수고하셨습니다  ^^  
    
      궁금        03-04-26  02:41      
암호화라는게  결국  서버단에서는  사용자가  주는  정보가  
키가  되므로  여러가지  짬뽕해도  사용자  키만  알아내면  
뚫리지  않을까요?    
  
암호화라는게  결국  서버단에서는  사용자가  주는  정보가
키가  되므로  여러가지  짬뽕해도  사용자  키만  알아내면
뚫리지  않을까요?  
    
      TarauS        03-04-26  09:36      
참고//  
세션을  쓸  때  쿠키를  전혀  사용하지  않을  수는  없습니다.세션을  시작하면  기본적으로  세션키가  쿠키로  등록이됩니다.  
글구  좀  더  보안에  신경을  쓴다면  세션키를  암호화할  수도  있긴  한데  지금  사용하는  방법과  별  차이가  없다고  봅니다.  왜냐면  지금  생각한  방법도  세션키와,  사용자  환경  정보와  서버키를  모두  알아야지만  알  수  있기  때문이죠..  
여기다가  환경을  register_globals  =  off로  셋팅하고  넘어오는  값들을  체크하면  더  좋구여...  

궁금//  
그럴  가능성도  있긴합니다.  여기  글에는  올리지  않았지만  그럴  경우에  대비해서  서비키를  따로  두고  있습니다.  이  세션파일을  셋팅하면서  설정하는  변수  중에  서버키  변수를  따로  설정하고  이  값을  유저키랑  조합한  다음에  그걸  암호화하는  것이죠.  그렇게  된다면  뚫기가  좀더  어려워  지겠죠..    
  
참고//
세션을  쓸  때  쿠키를  전혀  사용하지  않을  수는  없습니다.세션을  시작하면  기본적으로  세션키가  쿠키로  등록이됩니다.
글구  좀  더  보안에  신경을  쓴다면  세션키를  암호화할  수도  있긴  한데  지금  사용하는  방법과  별  차이가  없다고  봅니다.  왜냐면  지금  생각한  방법도  세션키와,  사용자  환경  정보와  서버키를  모두  알아야지만  알  수  있기  때문이죠..
여기다가  환경을  register_globals  =  off로  셋팅하고  넘어오는  값들을  체크하면  더  좋구여...

궁금//
그럴  가능성도  있긴합니다.  여기  글에는  올리지  않았지만  그럴  경우에  대비해서  서비키를  따로  두고  있습니다.  이  세션파일을  셋팅하면서  설정하는  변수  중에  서버키  변수를  따로  설정하고  이  값을  유저키랑  조합한  다음에  그걸  암호화하는  것이죠.  그렇게  된다면  뚫기가  좀더  어려워  지겠죠..  
    
      TarauS        03-04-26  09:38      
query//  
중복로긴  기능은  그리  어렵지  않을  것이라  생각됩니다.  id  필드와  ip  필드를  추가해서  id  정보와  ip정보를  담고  로그인  체크  부분에서  이  값들을  비교하면  쉽게  구현  가능하리라  봅니다.  이  부분은  이걸  이용하시는  분들의  숙제로  남겨드리겠습니다.    
  
query//
중복로긴  기능은  그리  어렵지  않을  것이라  생각됩니다.  id  필드와  ip  필드를  추가해서  id  정보와  ip정보를  담고  로그인  체크  부분에서  이  값들을  비교하면  쉽게  구현  가능하리라  봅니다.  이  부분은  이걸  이용하시는  분들의  숙제로  남겨드리겠습니다.  
    
      wawoo        03-04-26  12:44      
보안을  위한  거라면  
http_referer  를  이용해서  요청이  들어온  페이지의  주소를  이용해서  제한을  하고  HTTP  프로토콜  방식으로  내부적으로  키를  날려서  데이터베이스에  인증키를  등록하고  그걸  체크하면.....  
잠깐  구상해  봤습니다.    
  
보안을  위한  거라면
http_referer  를  이용해서  요청이  들어온  페이지의  주소를  이용해서  제한을  하고  HTTP  프로토콜  방식으로  내부적으로  키를  날려서  데이터베이스에  인증키를  등록하고  그걸  체크하면.....
잠깐  구상해  봤습니다.  
    
      TarauS        03-04-26  13:14      
wawoo//  
현재  그런식으로  구성이  되어있습니다.  위에  소스를  보면  HTTP_REFERER을  체크하고  있고  또한  받아들이는  파일이름도  체크하고  있습니다.  
그리고  기본으로  세션키를  이용하면서  검증용키를  하나  더  만들어서  데이터베이스에서  쿼리하여  결과를  얻어내는  방식입니다.    
  
wawoo//
현재  그런식으로  구성이  되어있습니다.  위에  소스를  보면  HTTP_REFERER을  체크하고  있고  또한  받아들이는  파일이름도  체크하고  있습니다.
그리고  기본으로  세션키를  이용하면서  검증용키를  하나  더  만들어서  데이터베이스에서  쿼리하여  결과를  얻어내는  방식입니다.  
    
      Fencer        03-04-26  14:00      
>>>  wawoo  
사실  referer는  작정한  사람에게는  있으나  마나합니다.  
어차피  세션키를  먹으려고  작정한  사람은  
HTTP  Header를  조작하려  하는  셈이고,  
그  때  Referer는  아무런  가치가  없죠.  
아주  아주  조금  귀찮아질  뿐.  ㅡㅡ;  
(실제로  저도  장난할  때  브라우저가  보내는  
헤더  정보  100%  똑같이  넘깁니다.)  

중요한  것은  모든  키와  환경  정보를  알아도  
권한을  획득하지  못  하도록  하는  것이죠.  
공개키가  강력한  게  바로  그런  거  아니겠습니까.    
  
>>>  wawoo
사실  referer는  작정한  사람에게는  있으나  마나합니다.
어차피  세션키를  먹으려고  작정한  사람은
HTTP  Header를  조작하려  하는  셈이고,
그  때  Referer는  아무런  가치가  없죠.
아주  아주  조금  귀찮아질  뿐.  ㅡㅡ;
(실제로  저도  장난할  때  브라우저가  보내는
헤더  정보  100%  똑같이  넘깁니다.)

중요한  것은  모든  키와  환경  정보를  알아도
권한을  획득하지  못  하도록  하는  것이죠.
공개키가  강력한  게  바로  그런  거  아니겠습니까.  
    
      TarauS        03-04-26  19:48      
참고//  
session_start()함수를  사용하지  않는다면  세션을  전혀  사용할  수  없는  것이겠죠..  그러면  여기서  예기할  의미가  없어지겠죠?^^    
  
참고//
session_start()함수를  사용하지  않는다면  세션을  전혀  사용할  수  없는  것이겠죠..  그러면  여기서  예기할  의미가  없어지겠죠?^^  
    
      Fencer        03-04-26  21:25      
session_start()  한다고  쿠키  굽는  거  아니죠.  
php.ini  에서  쿠키를  사용하도록  설정되어  있어야  하거든요.  
물론  GET,  POST  등으로  넘길  수도  있습니다.  
매뉴얼을  보시길.    
  
session_start()  한다고  쿠키  굽는  거  아니죠.
php.ini  에서  쿠키를  사용하도록  설정되어  있어야  하거든요.
물론  GET,  POST  등으로  넘길  수도  있습니다.
매뉴얼을  보시길.  
    
      ~.`        03-04-26  22:42      
ini_set을  참고..    
  
ini_set을  참고..  
    
      Fencer        03-04-27  00:04      
>>>  참고  
그런  의미가  아니죠.  
PHP  자체의  세션은  session_start()를  하지  않을  경우  
사용할  수  없는  게  맞습니다.  맞고요.  
사실  세션  비스무리한  걸  자체적으로  개발해서  한다한들  
HTTP  1.1  한계  내에서  PHP  세션보다  나아질  게  별로  없죠.  
HTTPS를  써야.  ㅋㅋ;;;    
  
>>>  참고
그런  의미가  아니죠.
PHP  자체의  세션은  session_start()를  하지  않을  경우
사용할  수  없는  게  맞습니다.  맞고요.
사실  세션  비스무리한  걸  자체적으로  개발해서  한다한들
HTTP  1.1  한계  내에서  PHP  세션보다  나아질  게  별로  없죠.
HTTPS를  써야.  ㅋㅋ;;;  
    
      TarauS        03-04-27  00:58      
세션을  전혀  사용할  수  없다는  것은  제가  잘못  말씀드린것  같습니다.  지금  제가  구현한  방법에서는  세션키를  기준으로해서  db에  쿼리를  날려서  읽어오고  db에  저장하는  것이기에  세션키가  필요하므로  그렇게  말씀드렸던  것입니다.  
세션키를  사용해서  이런  식으로  구현하는  것이  괜찮은  방법인거  같아  만들게  되었던거구요...    
  
세션을  전혀  사용할  수  없다는  것은  제가  잘못  말씀드린것  같습니다.  지금  제가  구현한  방법에서는  세션키를  기준으로해서  db에  쿼리를  날려서  읽어오고  db에  저장하는  것이기에  세션키가  필요하므로  그렇게  말씀드렸던  것입니다.
세션키를  사용해서  이런  식으로  구현하는  것이  괜찮은  방법인거  같아  만들게  되었던거구요...  
    
      TarauS        03-04-27  01:07      
위에서  궁금님이  제시했던  서버키란  것을  다시  한번  생각해  보았는데  제가  잘못  생각하고  있었습니다.  서버키란것을  함께  만들어  암호화한  것을  비교할려구  했는데  어짜피  사용자  환경과  아이피  같은  것을  안다면  이것만  가지고  암호화를  하나  서버키를  하나더  추가해서  암호화  하나  별  차이가  없을  것  같네염..  
왜냐면  사용자키와  서버키를    조합해서  만들어진  키를  암호화할  때  서버키는  고정된것이고  사용자키를  사용자  환경과  아이피만  알면  만들  수  있기에  암호화된  키도  만드는게  가능하겠죠..  
이  부분에  대해서도  조금더  생각해  보고서  보완할  방법을  올리도록  하겠습니다.    
  
위에서  궁금님이  제시했던  서버키란  것을  다시  한번  생각해  보았는데  제가  잘못  생각하고  있었습니다.  서버키란것을  함께  만들어  암호화한  것을  비교할려구  했는데  어짜피  사용자  환경과  아이피  같은  것을  안다면  이것만  가지고  암호화를  하나  서버키를  하나더  추가해서  암호화  하나  별  차이가  없을  것  같네염..
왜냐면  사용자키와  서버키를    조합해서  만들어진  키를  암호화할  때  서버키는  고정된것이고  사용자키를  사용자  환경과  아이피만  알면  만들  수  있기에  암호화된  키도  만드는게  가능하겠죠..
이  부분에  대해서도  조금더  생각해  보고서  보완할  방법을  올리도록  하겠습니다.  
    
      Fencer        03-04-27  01:45      
>>>  참고  
님은  잘  알지  못  하면서  남을  깔아  뭉개는  걸  즐기시나봐요.  
\"틀에  박힌  코딩만  한다는  뜻으로  알겠습니다.^^\"  
\"님의  수준으로  알겠습니다.\"  
고상한  취미를  가지셨네요.  ^  ^)b  

쿠키를  사용하지  않는  것(GET,  POST,  ...)과  
사용하는  거는  거의  차이가  없습니다.  
쿠키는  다른  메서드로  전달해도  될  것을  
귀차니즘을  피하기  위해  쓰는  것  뿐입니다.  
HTTP  표준  문서  읽어보셨습니까?  
HTTP만으로는  아무리  발버둥을  쳐도  
키를  만드는  규칙이  밝혀지기만  하면  끝장입니다.  
프로토콜  자체의  한계라고  할  수  있죠.  
그래서  신용  카드  회사,  은행  등등의  사이트에서는  
클라이언트에  보안툴  설치하고  시작하는  겁니다.  
아니면  HTTPS로  바꾸든지요.  

남에게  아는  척을  하시려면  지식을  좀  더  쌓고  해보세요.  
그럼  기쁘게  가르침을  받도록  하지요.  
왜  HTTP로는  아무리  잘  만들어봐야  한계가  있고,  
HTTPS로  바꾸어야  한다고  하는지도  모르고  말씀하시는  건지.    
  
>>>  참고
님은  잘  알지  못  하면서  남을  깔아  뭉개는  걸  즐기시나봐요.
\"틀에  박힌  코딩만  한다는  뜻으로  알겠습니다.^^\"
\"님의  수준으로  알겠습니다.\"
고상한  취미를  가지셨네요.  ^  ^)b

쿠키를  사용하지  않는  것(GET,  POST,  ...)과
사용하는  거는  거의  차이가  없습니다.
쿠키는  다른  메서드로  전달해도  될  것을
귀차니즘을  피하기  위해  쓰는  것  뿐입니다.
HTTP  표준  문서  읽어보셨습니까?
HTTP만으로는  아무리  발버둥을  쳐도
키를  만드는  규칙이  밝혀지기만  하면  끝장입니다.
프로토콜  자체의  한계라고  할  수  있죠.
그래서  신용  카드  회사,  은행  등등의  사이트에서는
클라이언트에  보안툴  설치하고  시작하는  겁니다.
아니면  HTTPS로  바꾸든지요.

남에게  아는  척을  하시려면  지식을  좀  더  쌓고  해보세요.
그럼  기쁘게  가르침을  받도록  하지요.
왜  HTTP로는  아무리  잘  만들어봐야  한계가  있고,
HTTPS로  바꾸어야  한다고  하는지도  모르고  말씀하시는  건지.  
    
      Fencer        03-04-27  01:53      
IP까지  속이는  세상입니다.  
안전하다고  생각하는  거  자체가  잘못된  거죠.  
불완전하다는  걸  알고  있어야합니다.    
  
IP까지  속이는  세상입니다.
안전하다고  생각하는  거  자체가  잘못된  거죠.
불완전하다는  걸  알고  있어야합니다.  
    
      0172        03-04-27  02:13      
이건  제  생각일  뿐인데요...만약에  사용자키를  만드는  규칙을  알고  있더라도  똑같은  사용자키를  만드는건  어려운거  아닌가요?  
예를  들어서  crypt  함수  같은  경우는  똑같은  문자를  가지고도  매번  실행할때  마다  다른  값이  나오지  않나요...?  
여기다가  ip  address,  브바루저  정보,  microtime  등등을  같이  조합해서  암호화  한다면  더욱  그럴것  같은데...    
  
이건  제  생각일  뿐인데요...만약에  사용자키를  만드는  규칙을  알고  있더라도  똑같은  사용자키를  만드는건  어려운거  아닌가요?
예를  들어서  crypt  함수  같은  경우는  똑같은  문자를  가지고도  매번  실행할때  마다  다른  값이  나오지  않나요...?
여기다가  ip  address,  브바루저  정보,  microtime  등등을  같이  조합해서  암호화  한다면  더욱  그럴것  같은데...  
    
      0172        03-04-27  02:23      
역시  생각일뿐인데...  세션키를  사용하지  않고도  사용자  인증을  할  수  있을것  같습니다.  올바르게  로그인한  사용자에게  유일한  인증키를  부여하고  db에  저장한  후  이  인증키로  사용자를  확인하면  되지  않을까  싶은데...  물론  인증키는  같은  문자로  암호화해도  절대  같아지지  않는  방법으로  만들어서말이죠...    
  
역시  생각일뿐인데...  세션키를  사용하지  않고도  사용자  인증을  할  수  있을것  같습니다.  올바르게  로그인한  사용자에게  유일한  인증키를  부여하고  db에  저장한  후  이  인증키로  사용자를  확인하면  되지  않을까  싶은데...  물론  인증키는  같은  문자로  암호화해도  절대  같아지지  않는  방법으로  만들어서말이죠...  
    
      Fencer        03-04-27  02:32      
>>>  0172  
\"로그인한  사용자에게  유일한  인증키를  부여한다.\"  
이게  바로  세션키가  아니든가요?  6^  ^;;;  
세션키가  꼭  md5로  만든  32Bytes  문자열일  필요는  없죠.  
절대  겹치지만  않는다면  그냥  int로  해도  돼요.  

그리고  몰라서  묻는  건데요...  
같은  문자로  암호화해도  매번  다르다면  
어떻게  비교를  할  수가  있을까요.  ㅡ.ㅡ;;;  

아,  그리고  crypt는  salt가  달라져야만  
다른  값이  나온다고  알고  있습니다.    
  
>>>  0172
\"로그인한  사용자에게  유일한  인증키를  부여한다.\"
이게  바로  세션키가  아니든가요?  6^  ^;;;
세션키가  꼭  md5로  만든  32Bytes  문자열일  필요는  없죠.
절대  겹치지만  않는다면  그냥  int로  해도  돼요.

그리고  몰라서  묻는  건데요...
같은  문자로  암호화해도  매번  다르다면
어떻게  비교를  할  수가  있을까요.  ㅡ.ㅡ;;;

아,  그리고  crypt는  salt가  달라져야만
다른  값이  나온다고  알고  있습니다.  
    
      TarauS        03-04-27  03:15      
0172//  
현재는  사용자키를  비교할  때  똑같은  문자열만  비교합니다.  
그러니깐  똑같은  사용자  정보가  들어온다면  암호화된  사용자키도  똑같은  것을  사용해야  한다는  것이죠.  
그래야지  사용자가  A사이트에서  B사이트로  이동했을때  같은  사용자키를  가지고  있을  수  있는  것이죠...  
(제가  생각하는  사용자키에서는  microtime  같은  값은  이용하지  안습니다.  키를  만들었을때  유일성은  보장할  수  있겠지만  A사이트에  접속했을  때와  B사이트에  접속했을  때  같은  정보를  가지도록  할  수는  없기  때문입니다.그러나  사용자  환경  정보나  IP정보는  사용자가  A  사이트에  접속하든  B사이트에  접속하든  일정하기  때문에  사용하는  것입니다.여기서  microtime같은  값을  쿠키로  설정하거나  전송해  줄  수  있기는  하지만  어짜피  이건  조작의  가능성이  있기에  있으나  마나한  것으로  생각됩니다.)  
글구  세션키는  직접  만들어  쓰실  수도  있습니다.  자신이  직접  키를  만든  다음에  session_id(직접  만든  키)와  같이  하면  세션키를  설정할  수  있습니다.  

Fencer//  
제가  구현한  방법에서는  매번  암호화할  때마다  다른  암호화된키가  생성된다면  비교할  수는  없습니다.  
그러나  암호화  함수를  crypt()함수  같은  것을  사용한다면  매번  암호화할  때마다  키가  변경되도록  할  수  있습니다.  또한  비교도  가능하고여...  
그러나  어짜피  사용자  환경이나  아이피로  이루어진  사용자키를  가지고  암호화  하는  것이기  때문에  이  사용자키를  조정한다면  어짜피  암호화  자체가  의미가  없을  것  같습니다.  
그래서  다른  방법을  생각중에  있습니다.    
  
0172//
현재는  사용자키를  비교할  때  똑같은  문자열만  비교합니다.
그러니깐  똑같은  사용자  정보가  들어온다면  암호화된  사용자키도  똑같은  것을  사용해야  한다는  것이죠.
그래야지  사용자가  A사이트에서  B사이트로  이동했을때  같은  사용자키를  가지고  있을  수  있는  것이죠...
(제가  생각하는  사용자키에서는  microtime  같은  값은  이용하지  안습니다.  키를  만들었을때  유일성은  보장할  수  있겠지만  A사이트에  접속했을  때와  B사이트에  접속했을  때  같은  정보를  가지도록  할  수는  없기  때문입니다.그러나  사용자  환경  정보나  IP정보는  사용자가  A  사이트에  접속하든  B사이트에  접속하든  일정하기  때문에  사용하는  것입니다.여기서  microtime같은  값을  쿠키로  설정하거나  전송해  줄  수  있기는  하지만  어짜피  이건  조작의  가능성이  있기에  있으나  마나한  것으로  생각됩니다.)
글구  세션키는  직접  만들어  쓰실  수도  있습니다.  자신이  직접  키를  만든  다음에  session_id(직접  만든  키)와  같이  하면  세션키를  설정할  수  있습니다.

Fencer//
제가  구현한  방법에서는  매번  암호화할  때마다  다른  암호화된키가  생성된다면  비교할  수는  없습니다.
그러나  암호화  함수를  crypt()함수  같은  것을  사용한다면  매번  암호화할  때마다  키가  변경되도록  할  수  있습니다.  또한  비교도  가능하고여...
그러나  어짜피  사용자  환경이나  아이피로  이루어진  사용자키를  가지고  암호화  하는  것이기  때문에  이  사용자키를  조정한다면  어짜피  암호화  자체가  의미가  없을  것  같습니다.
그래서  다른  방법을  생각중에  있습니다.  
    
      전영규        03-04-27  13:51      
TarauS  님,  수고  많으십니다.  
키를  만들  때  사용자  정보를  이용하는  수도  있지만,  
임의의  키를  생성후에  (랜덤..)  그  키를  이용할  수도  있습니다.  
랜덤으로  키를  하나  생성후,  서버에  하나  보관하고  
클라이언트에  하나  보내주는  것이죠.  
다음  요청이  올  때,  그  키가  서버의  키와  같은  키인지  조사하면  됩니다.  여기서  키를  만드는  방법만  유일한  것이면  되고..  
님의  소스에서  별로  수정할  부분은  없습니다.  
제가  이렇게까지  말하면,  할만한  사람은  다  구현하겠죠  ?  
수고  많이  하셨구요,  이제  나머지  작업은  TarauS  님이  
공개  안하셔도  괜찮다고  봅니다...  ^^  
--  jeon.    
  
TarauS  님,  수고  많으십니다.
키를  만들  때  사용자  정보를  이용하는  수도  있지만,
임의의  키를  생성후에  (랜덤..)  그  키를  이용할  수도  있습니다.
랜덤으로  키를  하나  생성후,  서버에  하나  보관하고
클라이언트에  하나  보내주는  것이죠.
다음  요청이  올  때,  그  키가  서버의  키와  같은  키인지  조사하면  됩니다.  여기서  키를  만드는  방법만  유일한  것이면  되고..
님의  소스에서  별로  수정할  부분은  없습니다.
제가  이렇게까지  말하면,  할만한  사람은  다  구현하겠죠  ?
수고  많이  하셨구요,  이제  나머지  작업은  TarauS  님이
공개  안하셔도  괜찮다고  봅니다...  ^^
--  jeon.  
    
      전영규        03-04-27  13:53      
위의  방식은  일종의  \'비밀키\'방식의  보안이라고  할  수  있구요.  
공개키  방식으로  가면  좋은데  연산량이  장난이  아니고,  굳이  그렇게까지  할  필요도  없습니다..    특히,  서버대  클라이언트라면  굳이  공개키로  갈  필요도  없구요...  왜냐하면,  서버가  해킹당하지  않는한  비밀키의  조합방법이  노출되지  않을테니까요.  
--  jeon.    
  
위의  방식은  일종의  \'비밀키\'방식의  보안이라고  할  수  있구요.
공개키  방식으로  가면  좋은데  연산량이  장난이  아니고,  굳이  그렇게까지  할  필요도  없습니다..    특히,  서버대  클라이언트라면  굳이  공개키로  갈  필요도  없구요...  왜냐하면,  서버가  해킹당하지  않는한  비밀키의  조합방법이  노출되지  않을테니까요.
--  jeon.  
    
      전영규        03-04-27  13:57      
참...  쓰고보니  키를  그대로  도용하는  경우에  대한  대비를  놓쳤군요...  이는  IP로  구분해도  대부분  충분합니다.  (키  자체에  IP정보를  담고  있는게  편하구요..  )  
IP를  속이는  단계는  크게  proxy  와  IP헤더의  임의조작으로  가능한데,  proxy  는  같은  proxy  단에  사용자가  있어야  가능하니까  이  부분에  대해서만  약간  신경쓰면  되구요.  
IP헤더  수정부분은,  TCP가  내부  연결을  위해  3-핸드쉐이킹을  하면서  피어를  확인하기  때문에,  HTTP상에서의  IP헤더  수정은  불가능합니다..    
--  jeon.    
  
참...  쓰고보니  키를  그대로  도용하는  경우에  대한  대비를  놓쳤군요...  이는  IP로  구분해도  대부분  충분합니다.  (키  자체에  IP정보를  담고  있는게  편하구요..  )
IP를  속이는  단계는  크게  proxy  와  IP헤더의  임의조작으로  가능한데,  proxy  는  같은  proxy  단에  사용자가  있어야  가능하니까  이  부분에  대해서만  약간  신경쓰면  되구요.  
IP헤더  수정부분은,  TCP가  내부  연결을  위해  3-핸드쉐이킹을  하면서  피어를  확인하기  때문에,  HTTP상에서의  IP헤더  수정은  불가능합니다..    
--  jeon.  
    
      TarauS        03-04-27  14:48      
전영규//  격려해  주셔서  고맙습니다...^^  
현재  사용자키를  만들  때  아이피  정보도  함께  넣어  키를  만들고  이걸  다시  암호화합니다.이  방법에  보완이  필요한  것인가요?    
  
전영규//  격려해  주셔서  고맙습니다...^^
현재  사용자키를  만들  때  아이피  정보도  함께  넣어  키를  만들고  이걸  다시  암호화합니다.이  방법에  보완이  필요한  것인가요?  
    
      Fencer        03-04-27  15:32      
>>>  TarauS  
전영규님이  말씀하신  것은  (전영규님  글에도  나왔듯)  
결국  이미  TarauS님이  하신  거랑  마찬가지  방식입니다.  
PHP  자체에서  만드는  session_id도  랜덤이죠.  
거기다  사용자의  환경  정보와  IP,  서버쪽  키  등을  추가해  
단방향  암호화  한번  해주는  게  좋긴  더  좋은데  
이미  어느  정도  하셨을  거라는  생각이  듭니다.  
저의  경우는  1.  session_id  자체에  사용자  환경  정보를  넣어  만들고  
2.  session_id,  사용자  환경  정보,  서버  키  등등을  넣어  체크용  쿠키를  하나  씁니다.  
2가지가  모두  맞아야  정상적인  것으로  인정합니다.  
아,  불순한  시도가  있다고  세션  자체를  제거하지는  말아야겠죠.  
그럼  정상적으로  사용하던  사람이  곤란해지니까.  ㅡㅡ;    
  
>>>  TarauS
전영규님이  말씀하신  것은  (전영규님  글에도  나왔듯)
결국  이미  TarauS님이  하신  거랑  마찬가지  방식입니다.
PHP  자체에서  만드는  session_id도  랜덤이죠.
거기다  사용자의  환경  정보와  IP,  서버쪽  키  등을  추가해
단방향  암호화  한번  해주는  게  좋긴  더  좋은데
이미  어느  정도  하셨을  거라는  생각이  듭니다.
저의  경우는  1.  session_id  자체에  사용자  환경  정보를  넣어  만들고
2.  session_id,  사용자  환경  정보,  서버  키  등등을  넣어  체크용  쿠키를  하나  씁니다.
2가지가  모두  맞아야  정상적인  것으로  인정합니다.
아,  불순한  시도가  있다고  세션  자체를  제거하지는  말아야겠죠.
그럼  정상적으로  사용하던  사람이  곤란해지니까.  ㅡㅡ;  
    
      전영규        03-04-27  16:29      
TarauS님,  Fencer  님,  이견이  없습니다.  ^^  
휴일  잘  보내세요.  
--  jeon.    
  
TarauS님,  Fencer  님,  이견이  없습니다.  ^^
휴일  잘  보내세요.  
--  jeon.  
    
      굿임다        03-04-27  17:40      
이런  기능이  필요했었는데  이렇게  구현해  주시니  정말로  감사드립니다.    
  
이런  기능이  필요했었는데  이렇게  구현해  주시니  정말로  감사드립니다.  
    
      TarauS        03-04-28  13:46      
참고//  
글이란것은  어떻게  쓰느냐에  따라  기분이  나쁠  수도  있고  좋을  수도  있는  것입니다.  
님이  남긴  글에  저도  기분이  약간은  상했습니다.  
저나  Fencer님이  잘못된  의견을  주장하셨더라도  그것을  삐딱하게  말하는  것  보다는  무엇이  잘못됐는지를  정확히  지적해  주시는게  글을  남긴  우리들이나  다른  분들이  보기에도  좋은  것이죠.  
제가  알고  있는  것을  저는  맞다고  믿고  있을  수  있고  나중에  잘못된  것을  알게  되면  그때  또  배워나가는  것이니까요...    
  
참고//
글이란것은  어떻게  쓰느냐에  따라  기분이  나쁠  수도  있고  좋을  수도  있는  것입니다.
님이  남긴  글에  저도  기분이  약간은  상했습니다.  
저나  Fencer님이  잘못된  의견을  주장하셨더라도  그것을  삐딱하게  말하는  것  보다는  무엇이  잘못됐는지를  정확히  지적해  주시는게  글을  남긴  우리들이나  다른  분들이  보기에도  좋은  것이죠.
제가  알고  있는  것을  저는  맞다고  믿고  있을  수  있고  나중에  잘못된  것을  알게  되면  그때  또  배워나가는  것이니까요...  
    
      깨스        03-04-30  00:17      
-----  
키를  두개를  만든다는  것은...  비교할  수  있는  키를  하나  
더  만든다는  것이군요.  즉  ip  정보나  기타  클라이언트의  유일한  
정보를  가지고,  키를  만들고  서버단에서  암호화  하여  확인할  수  있는...  

그것이  아니라면.  세션키  값은  이미  유일할테고....  

근데  의문점이  생깁니다.  

1.  세션키를  왜  쿠키로만  보존할라고  하시나요?  URL로  넘기면  안되나요?  

2.  두개이상의  서버의  세션을  공유하는데.  하나의  세션키의  보안을  신경쓰는  것과  
두개이상의서버로  공유할  세션키를  신경쓰는  것과  차이가  많은가요?  

3.  복호화나  암호화  하여  비교  가능한  키를  만든다  하여도.  
키가  계속  변하지  않는  이상  무의미하죠?  
그렇다면  기존의  세션키와  무슨  차이가  있는거죠?  

어느  겝을  두고  변한다면...  DB나  연산작업등  system에  부하를  주지않는  선에서  변한다고  
하여도.  세션키를  스니핑하여  세션키가  존재하는  동안에  해킹하는  넘을  막을  수  있을라나?  

https를  전체적인  시스템에서  쓴다는  것도  문제가  있고...  
접속자가  적다면  상관없지만.  

로그인시에  패스워드  인증시만  https를  쓰고  

인증이나  키타  보안에  필요한  유지성  변수나  자료  객체들은  세션을  이용하되.  
접속자가  많고  부하가  심하다면,  쿠키로  구현하는  겁니다.  
쿠키로  인증시는  단순하게  값이  있나  없나를  체크하는게  아니라  
IP,  시간으로,  클라이언트정보로  로그인시나  특정  시간마다  변할  수  있는...  것을  암호화하여.  



세션키  해킹을  예비해  다른  키를  둔다는  것  자체가  제가볼땐  무의미한것  같네요  

글고  
mysql_pconnect()  하면,  나중에  conn가  꽉  차지  않나요??  

참고로...  타라우스는  제가  잘  아는  분인거  같고...  지송하지만  저번글도  보고  비슷한  글을  올렸지만.  글은  시간이  없어  자세히  정독은  못했습니다.  아무래도  제가  논지를  제대로  파악하지  못하고  글을  쓴거  같기도하고....  여하튼  별  신경  쓰지마세요.    
  
-----
키를  두개를  만든다는  것은...  비교할  수  있는  키를  하나  
더  만든다는  것이군요.  즉  ip  정보나  기타  클라이언트의  유일한  
정보를  가지고,  키를  만들고  서버단에서  암호화  하여  확인할  수  있는...  

그것이  아니라면.  세션키  값은  이미  유일할테고....

근데  의문점이  생깁니다.

1.  세션키를  왜  쿠키로만  보존할라고  하시나요?  URL로  넘기면  안되나요?

2.  두개이상의  서버의  세션을  공유하는데.  하나의  세션키의  보안을  신경쓰는  것과  
두개이상의서버로  공유할  세션키를  신경쓰는  것과  차이가  많은가요?

3.  복호화나  암호화  하여  비교  가능한  키를  만든다  하여도.  
키가  계속  변하지  않는  이상  무의미하죠?
그렇다면  기존의  세션키와  무슨  차이가  있는거죠?

어느  겝을  두고  변한다면...  DB나  연산작업등  system에  부하를  주지않는  선에서  변한다고
하여도.  세션키를  스니핑하여  세션키가  존재하는  동안에  해킹하는  넘을  막을  수  있을라나?

https를  전체적인  시스템에서  쓴다는  것도  문제가  있고...  
접속자가  적다면  상관없지만.

로그인시에  패스워드  인증시만  https를  쓰고

인증이나  키타  보안에  필요한  유지성  변수나  자료  객체들은  세션을  이용하되.
접속자가  많고  부하가  심하다면,  쿠키로  구현하는  겁니다.  
쿠키로  인증시는  단순하게  값이  있나  없나를  체크하는게  아니라
IP,  시간으로,  클라이언트정보로  로그인시나  특정  시간마다  변할  수  있는...  것을  암호화하여.



세션키  해킹을  예비해  다른  키를  둔다는  것  자체가  제가볼땐  무의미한것  같네요

글고
mysql_pconnect()  하면,  나중에  conn가  꽉  차지  않나요??

참고로...  타라우스는  제가  잘  아는  분인거  같고...  지송하지만  저번글도  보고  비슷한  글을  올렸지만.  글은  시간이  없어  자세히  정독은  못했습니다.  아무래도  제가  논지를  제대로  파악하지  못하고  글을  쓴거  같기도하고....  여하튼  별  신경  쓰지마세요.  
    
      TarauS        03-04-30  09:38      
깨스//  
처음  이  방법을  시도할  때는  보안을  크게  신경쓰지  않은  상황에서  기능  구현에  초점을  두고서  만들었습니다.  
그러나  첫번째  글을  올린  후  많은  분들의  보안에  관한  의견을  듣고서  다시  수정하여  올린  것이  이  글입니다.  
기본적인  방법은  세션을  파일이  아닌  DB를  통해서  저장한다면  다른  서버에서도  디비  서버에  권한이  있다면  세션정보를  가져올  수  있는  것을  이용했습니다.  
디비에서  쿼리할  때    세션키를  키로  해서  자료를  읽어  오는  방법을  썼는데  문제는  이  세션키란  것이  노출된다면  보안의  허점이  생기는  것입니다.(세션키를  키로  해서  쿼리를  하는  것이기  때문)  세션키만  안다면  웬만한  사람은  충분히  뚫고  들어올  수가  있는  것이지요  
그래서  생각해  낸  것이  이  세션키가  정상적인  것인지  검증을  할  키를  만드는  것이였습니다.  
이  키는  사용자가  가지는  고유한  값(사용자환경,아이피등등)을  조합해서  만들고  이걸  암호화한  데이타를  세션정보와  함께  DB에  저장한  것이지요...  이렇게  할  경우  세션키를  안다고  해도  사용자환경과  똑같은  환경에서  세션이  유효한  시간에  세션키를  가지고  레퍼러를  속이고  들어와야지만  뚫을  수  있는  것이지요...(여기에도  약간의  문제는  있긴  합니다.)  
위의  이유  때문에  세션키를  검증할  키를  하나더  만들었던  것입니다.  

그럼  질문에  대한  답을  해  드리겠습니다.  
1.  세션키를  쿠키가  아닌  url로  넘겨도  상관은  없습니다.  
php.ini의  옵션  중에  session.use_trans_sid  란  옵션을  활성화시키면  세션키를  자동으로  url뒤에  붙일  수  있긴  한데  일반사용자에게  세션키를  노출시킬  필요가  없어  쿠키로  조용히(?)  처리하는  것입니다.  

2.  제가  정확히  질문이  무슨  뜻인지  이해를  못  하겠습니다.  

3.  세션키는  어짜피  쿠키로  구워지는  것이기에  맘만  먹으면  쉽게  얻어낼  수  있습니다.  그래서  검증용  사용자키를  만든  것이고  세션키와  검증용  사용자키가  둘  다  맞지  않으면  뚫기가  힘든  것이죠...  
그리고  검증용  키는  항상  변하게  할  수도  있습니다.  md5함수를  써서  암호화한다면  검증용  키는  암호화될  때마다  변하겠죠...  
그리고  세션키는  그냥  유일한  랜덤  문자열이지만  검증용키는  사용자의  정보를  담은  후  암호화된  문자열입니다.  

그리고  위에서도  예기한  것이지만  사용자키를  사용자의  환경  정보나  아이피로  했던  것은  사용자가  A  사이트에서  만들  검증용키와  B  사이트에서  만들  검증용키를  체크하기  위함입니다.  그래서  A  사이트에  있다가  B  사이트에  가면  바뀔  수  있는  값(시간정보)들은  검증용  키를  만들  때  사용하지  않았던  것이죠...  

PS.  근데...깨스님...절  어떻게  아시죠??    
  
깨스//
처음  이  방법을  시도할  때는  보안을  크게  신경쓰지  않은  상황에서  기능  구현에  초점을  두고서  만들었습니다.
그러나  첫번째  글을  올린  후  많은  분들의  보안에  관한  의견을  듣고서  다시  수정하여  올린  것이  이  글입니다.
기본적인  방법은  세션을  파일이  아닌  DB를  통해서  저장한다면  다른  서버에서도  디비  서버에  권한이  있다면  세션정보를  가져올  수  있는  것을  이용했습니다.
디비에서  쿼리할  때    세션키를  키로  해서  자료를  읽어  오는  방법을  썼는데  문제는  이  세션키란  것이  노출된다면  보안의  허점이  생기는  것입니다.(세션키를  키로  해서  쿼리를  하는  것이기  때문)  세션키만  안다면  웬만한  사람은  충분히  뚫고  들어올  수가  있는  것이지요
그래서  생각해  낸  것이  이  세션키가  정상적인  것인지  검증을  할  키를  만드는  것이였습니다.
이  키는  사용자가  가지는  고유한  값(사용자환경,아이피등등)을  조합해서  만들고  이걸  암호화한  데이타를  세션정보와  함께  DB에  저장한  것이지요...  이렇게  할  경우  세션키를  안다고  해도  사용자환경과  똑같은  환경에서  세션이  유효한  시간에  세션키를  가지고  레퍼러를  속이고  들어와야지만  뚫을  수  있는  것이지요...(여기에도  약간의  문제는  있긴  합니다.)
위의  이유  때문에  세션키를  검증할  키를  하나더  만들었던  것입니다.

그럼  질문에  대한  답을  해  드리겠습니다.
1.  세션키를  쿠키가  아닌  url로  넘겨도  상관은  없습니다.
php.ini의  옵션  중에  session.use_trans_sid  란  옵션을  활성화시키면  세션키를  자동으로  url뒤에  붙일  수  있긴  한데  일반사용자에게  세션키를  노출시킬  필요가  없어  쿠키로  조용히(?)  처리하는  것입니다.

2.  제가  정확히  질문이  무슨  뜻인지  이해를  못  하겠습니다.

3.  세션키는  어짜피  쿠키로  구워지는  것이기에  맘만  먹으면  쉽게  얻어낼  수  있습니다.  그래서  검증용  사용자키를  만든  것이고  세션키와  검증용  사용자키가  둘  다  맞지  않으면  뚫기가  힘든  것이죠...
그리고  검증용  키는  항상  변하게  할  수도  있습니다.  md5함수를  써서  암호화한다면  검증용  키는  암호화될  때마다  변하겠죠...
그리고  세션키는  그냥  유일한  랜덤  문자열이지만  검증용키는  사용자의  정보를  담은  후  암호화된  문자열입니다.

그리고  위에서도  예기한  것이지만  사용자키를  사용자의  환경  정보나  아이피로  했던  것은  사용자가  A  사이트에서  만들  검증용키와  B  사이트에서  만들  검증용키를  체크하기  위함입니다.  그래서  A  사이트에  있다가  B  사이트에  가면  바뀔  수  있는  값(시간정보)들은  검증용  키를  만들  때  사용하지  않았던  것이죠...

PS.  근데...깨스님...절  어떻게  아시죠??  
    
      깨스        03-04-30  11:11      
제  생각은  이렇습니다.  글로  설명할려니...  

세션키의  노출을  예비해  다른  키를  둔다는  것  자체가  별  의미가  없다고  생각되어집니다.  

1번  답에  대해서....  세션키를  URL상으로  노출되는  것은  쿠키에비해  보안상으로  아무런(?)  하자가  없습니다.  
네트윅  스니핑  의  경우  URL이나  쿠키나  같다고  보시믄되고.  
오히려  쿠키로  저장해  놓을  경우  
브라우저가  인터넷상의  특정  페이지나  스크립을  실행시킬때  쿠키값을  노출시킬  위험이  오히려  더  커지고요.  
(URL로  넘기는게  가능한데  불필요한  접속점을  두거나,  도메인이  틀릴  경우  각각  틀린  쿠키를  따로  꿔줘야  하는  문제가  또  발생하겠군요.)  

2.  근복적으로  하나의  싸이트의  세션의  키의  보안성에서  생각을  하나.  
두개의  서버의  세션값을  공유하기  위한  세션키의  보안이나.  
별반  차이가  없다는  겁니다.  물론  전혀  차이가  없는건  아니겠지만요  
구지  두개의  싸이트의  접속점에  구지  REFERER  체크하고  
그곳을  접속점으로  싸이트내  접속이  이루어질  필요는  없다고  생각합니다.  
그리고  그  REFERER  을  속이고  세션키를  도용해서  들어오는  사람에게  
다른  키  값을  한번  더  체크하게  한다는  자체가  의미가  없다고  생각합니다.  
이미  세션이라는  매커니즘  자체가  자료를  서버단에  저장하고  그  유일한  연결매체인  
세션키라는  방법을  제공하는데.  
구지  또다시  불필요한  오버헤드를  만들며  그  세션키의  무결성을  체크한다는  것  자체가  의미가  없다는거죠.  
(세션키는  노출되고  다른  키는  노출이  되지  않나요?  
그럼  세션키가  노출이  됐다면  클라이언트  정보는  노출이  없나요?)  
차라리  세션  maxlifetime?  인가  이넘을  작게  잡는  것이  효과적이겠죠...  

3.  세션키가  쿠키로  꾸어졌다고  맘만  먹으면  쉽게  얻어  내는  것은  아닐텐데요?  ㅡㅡ  
(네트윅  스니핑을  한다던지,  그  쿠키를  꾼  도메인서버처럼  클라이언트를  속인다던지.)  

세션키의  이중보안을  위한  방법론  보다는...  
아이디나  패스워드  입력시의  https  를  쓰거나,  
전체전인  시스템에  https를  적용하는  근본적인  방법론이  효율적이지  않을려나요?  

서버와  클라이언트가  암호화하여  통신하는  어플을  하나  만든것도....  ㅡㅡ    
  
제  생각은  이렇습니다.  글로  설명할려니...  

세션키의  노출을  예비해  다른  키를  둔다는  것  자체가  별  의미가  없다고  생각되어집니다.  

1번  답에  대해서....  세션키를  URL상으로  노출되는  것은  쿠키에비해  보안상으로  아무런(?)  하자가  없습니다.  
네트윅  스니핑  의  경우  URL이나  쿠키나  같다고  보시믄되고.
오히려  쿠키로  저장해  놓을  경우  
브라우저가  인터넷상의  특정  페이지나  스크립을  실행시킬때  쿠키값을  노출시킬  위험이  오히려  더  커지고요.
(URL로  넘기는게  가능한데  불필요한  접속점을  두거나,  도메인이  틀릴  경우  각각  틀린  쿠키를  따로  꿔줘야  하는  문제가  또  발생하겠군요.)

2.  근복적으로  하나의  싸이트의  세션의  키의  보안성에서  생각을  하나.  
두개의  서버의  세션값을  공유하기  위한  세션키의  보안이나.  
별반  차이가  없다는  겁니다.  물론  전혀  차이가  없는건  아니겠지만요
구지  두개의  싸이트의  접속점에  구지  REFERER  체크하고  
그곳을  접속점으로  싸이트내  접속이  이루어질  필요는  없다고  생각합니다.  
그리고  그  REFERER  을  속이고  세션키를  도용해서  들어오는  사람에게  
다른  키  값을  한번  더  체크하게  한다는  자체가  의미가  없다고  생각합니다.  
이미  세션이라는  매커니즘  자체가  자료를  서버단에  저장하고  그  유일한  연결매체인  
세션키라는  방법을  제공하는데.  
구지  또다시  불필요한  오버헤드를  만들며  그  세션키의  무결성을  체크한다는  것  자체가  의미가  없다는거죠.
(세션키는  노출되고  다른  키는  노출이  되지  않나요?  
그럼  세션키가  노출이  됐다면  클라이언트  정보는  노출이  없나요?)
차라리  세션  maxlifetime?  인가  이넘을  작게  잡는  것이  효과적이겠죠...

3.  세션키가  쿠키로  꾸어졌다고  맘만  먹으면  쉽게  얻어  내는  것은  아닐텐데요?  ㅡㅡ  
(네트윅  스니핑을  한다던지,  그  쿠키를  꾼  도메인서버처럼  클라이언트를  속인다던지.)

세션키의  이중보안을  위한  방법론  보다는...  
아이디나  패스워드  입력시의  https  를  쓰거나,  
전체전인  시스템에  https를  적용하는  근본적인  방법론이  효율적이지  않을려나요?

서버와  클라이언트가  암호화하여  통신하는  어플을  하나  만든것도....  ㅡㅡ  
    
      깨스        03-04-30  11:17      
아  글고...  PCONNECT  쓰면  connection  이  꽉  차지  않나요?  php가  알아서  조절하나....  ㅡㅡ  

쯔압.  저는  z*e*r****l  입니다.    
  
아  글고...  PCONNECT  쓰면  connection  이  꽉  차지  않나요?  php가  알아서  조절하나....  ㅡㅡ

쯔압.  저는  z*e*r****l  입니다.  
    
      Fencer        03-04-30  17:09      
>>>  깨스  

1.  URL은  하자가  있습니다.  
URL은  컴퓨터에  열어본  페이지  목록으로  기록된다는  
아주  원초적인  문제를  갖고  있습니다.  ㅡ.ㅡ;  
(물론  쿠키도  유효  기간을  브라우저  닫을  때까지로  하지  않으면  문제가  있겠죠.)  
그리고  좀  더  근본적으로  매번  처리하기  상당히  귀찮죠.  ㅋㅡ.ㅡ;;;  

>  브라우저가  인터넷상의  특정  페이지나  스크립을  실행시킬때  
>  쿠키값을  노출시킬  위험이  오히려  더  커지고요.  

이  부분은  조금  잘못  생각하신  거  같군요.  
document.cookie  처럼  document.location  등등이  있으니까요.  
오히려  document  속성  중에  URL과  관련된  게  더  많죠.  ;  

2.  세션키  자체를  변조하지  않는다는  가정하에서  
키  값을  하나  더  둔다는  것은  의미가  있습니다.  
기본적으로  노출을  피한다기보다는  
노출되도  어느  정도  안전한  것을  목표로  하는  게  옳고,  
사용자의  모든  정보가  노출된다  하더라도  
암호화시  검증용  키를  변하게  만드는  서버  쪽  키가  있는  한,  
그리고  암호화  방법  자체가  노출되지  않는  한은  
어느  정도  안전하다고  볼  수  있죠.  
그러니까  사용자의  모든  것을  알아내고  
IP까지  변조해서  들어오지  않는  한은  괜찮을  겁니다.  

3.  쿠키  얻어내는  거  쉬워요.  
자바스크립트를  모두  막지  않는  한  간단하죠.  ;;;  

HTTPS가  좋다는  데는  이의가  없지만,  
일단  현실은  그렇지가  못  하니까요.  ^  ^;  
전체에  HTTPS  적용하려면...  서버까지  바꾸어야  하는데.  ㅡ.ㅡ;;;  
일단  HTTP를  쓰는  현실에서  조금이나마  더  노력해봐야죠.  ㅎㅎ;;;    
  
>>>  깨스

1.  URL은  하자가  있습니다.
URL은  컴퓨터에  열어본  페이지  목록으로  기록된다는
아주  원초적인  문제를  갖고  있습니다.  ㅡ.ㅡ;
(물론  쿠키도  유효  기간을  브라우저  닫을  때까지로  하지  않으면  문제가  있겠죠.)
그리고  좀  더  근본적으로  매번  처리하기  상당히  귀찮죠.  ㅋㅡ.ㅡ;;;

>  브라우저가  인터넷상의  특정  페이지나  스크립을  실행시킬때
>  쿠키값을  노출시킬  위험이  오히려  더  커지고요.

이  부분은  조금  잘못  생각하신  거  같군요.
document.cookie  처럼  document.location  등등이  있으니까요.
오히려  document  속성  중에  URL과  관련된  게  더  많죠.  ;

2.  세션키  자체를  변조하지  않는다는  가정하에서
키  값을  하나  더  둔다는  것은  의미가  있습니다.
기본적으로  노출을  피한다기보다는
노출되도  어느  정도  안전한  것을  목표로  하는  게  옳고,
사용자의  모든  정보가  노출된다  하더라도
암호화시  검증용  키를  변하게  만드는  서버  쪽  키가  있는  한,
그리고  암호화  방법  자체가  노출되지  않는  한은
어느  정도  안전하다고  볼  수  있죠.
그러니까  사용자의  모든  것을  알아내고
IP까지  변조해서  들어오지  않는  한은  괜찮을  겁니다.

3.  쿠키  얻어내는  거  쉬워요.
자바스크립트를  모두  막지  않는  한  간단하죠.  ;;;

HTTPS가  좋다는  데는  이의가  없지만,
일단  현실은  그렇지가  못  하니까요.  ^  ^;
전체에  HTTPS  적용하려면...  서버까지  바꾸어야  하는데.  ㅡ.ㅡ;;;
일단  HTTP를  쓰는  현실에서  조금이나마  더  노력해봐야죠.  ㅎㅎ;;;  
    
      깨스        03-05-01  01:54      
Fancer  님  얘기가  맞네요  

제가  잘못  생각하거나  얘기한  부분도  있지만  그것은  부분적인  것들이고,  어차피  제  얘기의  골격은  아실껍니다.  

Fencer  님은  지금  타라우스님이  생각하는  부분들을  이미  구현을  하셨군요.  

3.  URL  +  업로드  +  게시판  +  쿠키  +  GET/POST  등등  많겠지만  기본적인  웹과  시스템의  지식  부족으로  생기는  보안구멍이  더  많을  테고...  그런  부분은  기본  아닐까요?  제가  볼때는  저부분에  더  신경  쓰는게  나을꺼  같아요.  여하튼  동의합니다.  
그리고  자바스크립에  의한  스니핑을  생각한다면....  HTTPS도  부분적으로  문제가  생기거나  소용이  없겠죠.  

그리고  실제로  제  운영경험상...  로그인부분은  Https처리를  해주고,  개인정보나  중요정보  페이지들도  https처리를  해주워도  그리  업렵지  않을꺼  같네요.  접속자들이  버틸만한  서버라면  전체에  적용한다  하여도  문제가  없겠죠.  

그건  그렇고...  ARP  스니핑  강도가  쌔더군요.  울  회사같은경우  제가  방화벽  접근이  안되기에  필요에  따라  이용할  수  있겠더군요.  ㅎㅎ  
스위칭일경우  일반  스니핑은  제약사항이  많고...  게이트웨이  역활하는  넘에서  잡아서  필요에따라  썼었는데....    
  
Fancer  님  얘기가  맞네요

제가  잘못  생각하거나  얘기한  부분도  있지만  그것은  부분적인  것들이고,  어차피  제  얘기의  골격은  아실껍니다.

Fencer  님은  지금  타라우스님이  생각하는  부분들을  이미  구현을  하셨군요.  

3.  URL  +  업로드  +  게시판  +  쿠키  +  GET/POST  등등  많겠지만  기본적인  웹과  시스템의  지식  부족으로  생기는  보안구멍이  더  많을  테고...  그런  부분은  기본  아닐까요?  제가  볼때는  저부분에  더  신경  쓰는게  나을꺼  같아요.  여하튼  동의합니다.
그리고  자바스크립에  의한  스니핑을  생각한다면....  HTTPS도  부분적으로  문제가  생기거나  소용이  없겠죠.

그리고  실제로  제  운영경험상...  로그인부분은  Https처리를  해주고,  개인정보나  중요정보  페이지들도  https처리를  해주워도  그리  업렵지  않을꺼  같네요.  접속자들이  버틸만한  서버라면  전체에  적용한다  하여도  문제가  없겠죠.

그건  그렇고...  ARP  스니핑  강도가  쌔더군요.  울  회사같은경우  제가  방화벽  접근이  안되기에  필요에  따라  이용할  수  있겠더군요.  ㅎㅎ
스위칭일경우  일반  스니핑은  제약사항이  많고...  게이트웨이  역활하는  넘에서  잡아서  필요에따라  썼었는데....  
    
      Fecner        03-05-01  03:02      
>>>  깨스  
넵.  님  말씀  이해합니다.  ^  ^)/  

구현을  해서  쓰고  있긴  하지만,  
제가  생각하고  막아놓은  것들에  헛점이  있나  고심하고  있죠.  
그래서  TarauS님  글에  관심을  많이  보이고  있습니다.  
알고  고민할수록  걱정거리가  늘어난다는...  ㅠㅠ;;;  

HTTPS를  쓰면  좋겠다...는  생각은  하는데  
글쎄요...  저  역시  님  말씀처럼  자바스크립트를  생각한다면  
로그인  부분만  써서는  별  소용이  없을  것  같다고  봅니다.  ^  ^;  
로그인할  때만  쓰면  비번이  노출되지  않는다  뿐이지  
로그인  마치고  나면  권한  얻는  게  가능해지니까요.  ㅡ.ㅡ;;;  
전체  적용하고  싶긴  허나...  역시  현실적인  문제가...  ㅎㅎㅎ;  
(사용자들도  귀찮다고  하거나  이상하다고  할  걸요.  ㅡ.ㅡ+;;;)  

윈도우용  스니핑  툴까지  공개적으로  돌아다니고  있으니...  
이거  참...  걱정이  태산입니다.  ㅡ.ㅡ+++    
  
>>>  깨스
넵.  님  말씀  이해합니다.  ^  ^)/

구현을  해서  쓰고  있긴  하지만,
제가  생각하고  막아놓은  것들에  헛점이  있나  고심하고  있죠.
그래서  TarauS님  글에  관심을  많이  보이고  있습니다.
알고  고민할수록  걱정거리가  늘어난다는...  ㅠㅠ;;;

HTTPS를  쓰면  좋겠다...는  생각은  하는데
글쎄요...  저  역시  님  말씀처럼  자바스크립트를  생각한다면
로그인  부분만  써서는  별  소용이  없을  것  같다고  봅니다.  ^  ^;
로그인할  때만  쓰면  비번이  노출되지  않는다  뿐이지
로그인  마치고  나면  권한  얻는  게  가능해지니까요.  ㅡ.ㅡ;;;
전체  적용하고  싶긴  허나...  역시  현실적인  문제가...  ㅎㅎㅎ;
(사용자들도  귀찮다고  하거나  이상하다고  할  걸요.  ㅡ.ㅡ+;;;)

윈도우용  스니핑  툴까지  공개적으로  돌아다니고  있으니...
이거  참...  걱정이  태산입니다.  ㅡ.ㅡ+++  
    
      샘        03-05-02  23:25      
문제는  클라이언트쪽의  유니크한  값을  모른다는데  있는것  같습니다.  참고하시길...  
if  (getenv(\'HTTP_X_FORWARDED_FOR\'))  {  
$ip  =  getenv(\'HTTP_X_FORWARD_FOR\');  
$host  =  gethostbyaddr($ip);  
}  else  {  
$ip  =  getenv(\'REMOTE_ADDR\');  
$host  =  gethostbyaddr($ip);  
}  
출처:  
http://www.php.net/manual/en/language.variables.predefined.php  

//  
//  Obtain  and  encode  users  IP  
//  
if(  getenv(\'HTTP_X_FORWARDED_FOR\')  !=  \'\'  )  
{  
        $client_ip  =  (  !empty($HTTP_SERVER_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_SERVER_VARS[\'REMOTE_ADDR\']  :  (  (  !empty($HTTP_ENV_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_ENV_VARS[\'REMOTE_ADDR\']  :  $REMOTE_ADDR  );  

        if  (  preg_match(\"/^([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)/\",  getenv(\'HTTP_X_FORWARDED_FOR\'),  $ip_list)  )  
        {  
                $private_ip  =  array(\'/^0\\./\',  \'/^127\\.0\\.0\\.1/\',  \'/^192\\.168\\..*/\',  \'/^172\\.16\\..*/\',  \'/^10.\\.*/\',  \'/^224.\\.*/\',  \'/^240.\\.*/\');  
                $client_ip  =  preg_replace($private_ip,  $client_ip,  $ip_list[1]);  
        }  
}  
else  
{  
        $client_ip  =  (  !empty($HTTP_SERVER_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_SERVER_VARS[\'REMOTE_ADDR\']  :  (  (  !empty($HTTP_ENV_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_ENV_VARS[\'REMOTE_ADDR\']  :  $REMOTE_ADDR  );  
}  
$user_ip  =  encode_ip($client_ip);  

출처  :  phpBB    
  
문제는  클라이언트쪽의  유니크한  값을  모른다는데  있는것  같습니다.  참고하시길...
if  (getenv(\'HTTP_X_FORWARDED_FOR\'))  {  
$ip  =  getenv(\'HTTP_X_FORWARD_FOR\');  
$host  =  gethostbyaddr($ip);  
}  else  {  
$ip  =  getenv(\'REMOTE_ADDR\');  
$host  =  gethostbyaddr($ip);  
}
출처:
http://www.php.net/manual/en/language.variables.predefined.php

//
//  Obtain  and  encode  users  IP
//
if(  getenv(\'HTTP_X_FORWARDED_FOR\')  !=  \'\'  )
{
$client_ip  =  (  !empty($HTTP_SERVER_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_SERVER_VARS[\'REMOTE_ADDR\']  :  (  (  !empty($HTTP_ENV_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_ENV_VARS[\'REMOTE_ADDR\']  :  $REMOTE_ADDR  );

if  (  preg_match(\"/^([0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+)/\",  getenv(\'HTTP_X_FORWARDED_FOR\'),  $ip_list)  )
{
$private_ip  =  array(\'/^0\\./\',  \'/^127\\.0\\.0\\.1/\',  \'/^192\\.168\\..*/\',  \'/^172\\.16\\..*/\',  \'/^10.\\.*/\',  \'/^224.\\.*/\',  \'/^240.\\.*/\');
$client_ip  =  preg_replace($private_ip,  $client_ip,  $ip_list[1]);
}
}
else
{
$client_ip  =  (  !empty($HTTP_SERVER_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_SERVER_VARS[\'REMOTE_ADDR\']  :  (  (  !empty($HTTP_ENV_VARS[\'REMOTE_ADDR\'])  )  ?  $HTTP_ENV_VARS[\'REMOTE_ADDR\']  :  $REMOTE_ADDR  );
}
$user_ip  =  encode_ip($client_ip);

출처  :  phpBB  
    
      Fecner        03-05-03  04:11      
>>>  샘  
위에  있는  소스는  보시면  아시겠지만  
단지  프락시  서버를  통해  접근할  경우  원래  IP를  찾는  것  뿐입니다.  
그리고  그것을  찾아도  고유한  값은  되지  못  합니다.  
1.  사설  IP를  통해  여러  대의  컴퓨터가  공인  IP를  공유  
2.  한  대의  컴퓨터에서  여러  개의  브라우저  실행  
3.  anonymous  proxy  
따라서  참고값이  될  뿐이지  그  이상도  그  이하도  되지는  못  한다고  생각합니다.  

그리고  참고로,  \'HTTP_X_FORWARDED_FOR\'만  있는  것은  아닙니다.  
프락시가  넘겨주는  값의  이름은  다른  경우가  종종  있죠.  
찾아보시면  몇  가지  나올  것입니다.    
  
>>>  샘
위에  있는  소스는  보시면  아시겠지만
단지  프락시  서버를  통해  접근할  경우  원래  IP를  찾는  것  뿐입니다.
그리고  그것을  찾아도  고유한  값은  되지  못  합니다.
1.  사설  IP를  통해  여러  대의  컴퓨터가  공인  IP를  공유
2.  한  대의  컴퓨터에서  여러  개의  브라우저  실행
3.  anonymous  proxy
따라서  참고값이  될  뿐이지  그  이상도  그  이하도  되지는  못  한다고  생각합니다.

그리고  참고로,  \'HTTP_X_FORWARDED_FOR\'만  있는  것은  아닙니다.
프락시가  넘겨주는  값의  이름은  다른  경우가  종종  있죠.
찾아보시면  몇  가지  나올  것입니다.  
    
      샘        03-05-03  06:31      
HTTP  1.1의  스펙을  살펴보았습니다.  사용자에게  유니크한  값을  부여하는것은  불가능한듯  합니다.  쿠키를  사용하는것이  유일한  방법으로  보입니다.  공유되고  있는  서브넷에서의  쿠키  장난은  막을  방법은  없겠군요.    
  
HTTP  1.1의  스펙을  살펴보았습니다.  사용자에게  유니크한  값을  부여하는것은  불가능한듯  합니다.  쿠키를  사용하는것이  유일한  방법으로  보입니다.  공유되고  있는  서브넷에서의  쿠키  장난은  막을  방법은  없겠군요.  
    
      백공열        03-05-07  21:45      
mysql_pconnect  <---  요  녀석  땜시  mysql  이  감당을  못할것  같습니다.  
java  의  connection  Pool  역할을  중간에서  해주는  녀석을  찾았는데.  
이걸  사용해야  큰  서비스가  가능할것  같습니다.  
http://sqlrelay.sourceforge.net  
[본문링크] [함수] 다른 서버, 다른 도메인간 세션 공유 방법 1차 개선
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=1173
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.